home *** CD-ROM | disk | FTP | other *** search
Wrap
package com.extensibility.xml; import com.extensibility.util.StringUtilities; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.util.Stack; public class SXE { public static final int CHILD = -1; public static final int SYBLING = -2; protected static final String TAG_XML_DECL = "<?xml"; protected static final String TAG_ELEMENT = "<"; protected static final String TAG_COMMENT = "<!--"; protected static final String TAG_END_ELEMENT = "</"; protected static final String TAG_DOC_TYPE_DECL = "<!"; protected static final String TAG_PI = "<?"; protected static final String TAG_CDATA_SECTION = "<![CDATA["; protected static final String TAG_ENTITY_REF = "&"; protected static final String INDENTS = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; protected static final String EOL = System.getProperty("line.separator"); Writer writer; protected String openTag; protected boolean openTagIsEmpty; protected Stack openTagNest = new Stack(); boolean atBOL = true; Exception lastError; boolean nextTagOnNewLine = true; protected boolean nestEmpty = true; int indent; int length = 0; public SXE(Writer var1) { this.writer = var1; } public SXE() { this.writer = new StringWriter(); } public Writer getWriter() { return this.writer; } public boolean isOpenTag(String var1) { return this.openTagNest.indexOf(var1) != -1; } public final int getLength() { return this.length; } public void writeHeader(String var1) { this.closeNest(); this.openTag("<?xml", String.valueOf(String.valueOf(" version =\"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var1)))).concat(String.valueOf("\""))); this.closeTag(); } public void writeHeader(String var1, String var2) { if (var2 == null) { this.writeHeader(var1); } else { this.closeNest(); this.openTag("<?xml", String.valueOf(String.valueOf(String.valueOf(String.valueOf(" version =\"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var1)))).concat(String.valueOf("\" encoding =\""))).concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var2)))).concat(String.valueOf("\""))); this.closeTag(); } } public void writeDocType(String var1) { this.closeNest(); this.openTag("<!", String.valueOf("DOCTYPE ").concat(String.valueOf(var1))); this.closeTag(); } public void writeDocType(String var1, String var2) { if (var2 == null) { this.writeDocType(var1); } else { this.closeNest(); this.openTag("<!", String.valueOf("DOCTYPE ").concat(String.valueOf(var1))); this.write(String.valueOf(String.valueOf(" SYSTEM \"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var2)))).concat(String.valueOf("\""))); this.closeTag(); } } public void writeDocTypeWithInternal(String var1, String var2, String var3) { this.closeNest(); this.openTag("<!", String.valueOf("DOCTYPE ").concat(String.valueOf(var1))); if (var2 != null && !var2.equals("")) { this.write(String.valueOf(String.valueOf(" SYSTEM \"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var2)))).concat(String.valueOf("\""))); } if (var3 != null && !var3.equals("")) { this.write(String.valueOf(String.valueOf(" [").concat(String.valueOf(var3))).concat(String.valueOf("]"))); } this.closeTag(); } public void writeDocType(String var1, String var2, String var3) { if (var2 == null && var3 == null) { this.writeDocType(var1); } else { this.closeNest(); this.openTag("<!", String.valueOf("DOCTYPE ").concat(String.valueOf(var1))); this.write(String.valueOf(String.valueOf(" PUBLIC \"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var2)))).concat(String.valueOf("\""))); this.write(String.valueOf(String.valueOf(" \"").concat(String.valueOf(StringUtilities.escapeDoubleQuotes(var3)))).concat(String.valueOf("\""))); this.closeTag(); } } public void writeElem(String var1) { this.writeElem(var1, this.getDepth() > 1 ? -2 : -1, false); } public void writeElem(String var1, boolean var2) { this.writeElem(var1, var2 ? -1 : -2, var2); } public void writeElem(String var1, int var2) { this.writeElem(var1, var2, false); } private int decodeDepth(String var1, int var2) { if (var2 == -1) { var2 = this.getDepth(); } else if (var2 == -2) { var2 = Math.max(0, this.getDepth() - 1); } return var2; } public void writeElem(String var1, int var2, boolean var3) { var2 = this.decodeDepth(var1, var2); if (var2 >= 0 && var2 <= this.getDepth()) { if (var3) { this.closeNest(var2); this.openTag("<", var1, true); } else { this.closeNest(var2); this.openTag("<", var1); this.openNest(var1); } this.nextTagOnNewLine = true; } else { throw new IllegalArgumentException(String.valueOf(String.valueOf(var2).concat(String.valueOf(" > "))).concat(String.valueOf(this.getDepth()))); } } public void writeCDATA(String var1) { this.nextTagOnNewLine = false; this.openTag("<![CDATA[", var1); this.closeTag(); } public void writeEntityRef(String var1) { this.nextTagOnNewLine = false; this.openTag("&", var1); this.closeTag(); } public void writePI(String var1, String var2) { this.openTag("<?", String.valueOf(String.valueOf(var1).concat(String.valueOf(" "))).concat(String.valueOf(var2))); this.closeTag(); } public void writeComment(String var1) { boolean var2 = this.nextTagOnNewLine; this.nextTagOnNewLine = false; this.openTag("<!--", var1); this.closeTag(); this.nextTagOnNewLine = var2; } public void writeComment(String var1, boolean var2) { if (var2) { this.writeLineBreak(true); } this.writeComment(var1); } public void flush(String var1) { int var2 = this.openTagNest.lastIndexOf(var1); if (var2 >= 0) { this.closeNest(var2); } } public void flushUpTo(String var1) { int var2 = this.openTagNest.lastIndexOf(var1); if (var2 >= 0) { this.closeNest(var2 + 1); } } public void flush() { this.closeNest(); } public void writeAttr(String var1, String var2) { this.checkAttrAllowed(); this.write(String.valueOf(String.valueOf(" ").concat(String.valueOf(var1))).concat(String.valueOf(" = \""))); if (var2 != null) { this.writeValidXML(replace(var2, "\"", """)); } this.write("\""); } protected void writeTextOrRawText(String var1, boolean var2) { this.closeTag(); if (var2) { this.write(var1); } else { this.writeValidXML(var1); } this.nestEmpty = false; if (!StringUtilities.isWhitespace(var1)) { this.nextTagOnNewLine = var1.indexOf(EOL) >= 0; } } public void writeRawText(String var1) { this.writeTextOrRawText(var1, true); } public void writeText(String var1) { this.writeTextOrRawText(var1, false); } public void writeText(String var1, boolean var2) { this.writeText(var1); this.nextTagOnNewLine = var2; } public int getDepth() { return this.openTagNest.size(); } public void writeLineBreak(boolean var1) { if (var1) { this.closeTag(); } this.writeLineBreak(); } public void writeLineBreak() { this.writeln(""); } protected void writeValidXML(String var1) { StringBuffer var2 = new StringBuffer(""); for(int var3 = 0; var3 < var1.length(); ++var3) { if (var1.charAt(var3) == '&') { if (var3 + 5 > var1.length() || !var1.substring(var3, var3 + 5).equals("&") && !var1.substring(var3, var3 + 5).equals("'")) { if (var3 + 4 > var1.length() || !var1.substring(var3, var3 + 4).equals("<") && !var1.substring(var3, var3 + 4).equals(">")) { var2.append("&"); } else { var2.append("&"); } } else { var2.append("&"); } } else { var2.append(var1.charAt(var3)); } } String var4 = var2.toString(); var4 = replace(var4, "<", "<"); this.write(var4); } protected void write(String var1) { try { this.writeIndent(); this.writer.write(var1); this.length += var1.length(); } catch (IOException var3) { this.lastError = var3; } } protected void writeIndent() { if (this.atBOL) { this.atBOL = false; this.write("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t".substring(0, this.indent)); } } protected void writeln(String var1) { this.write(var1); this.write(EOL); this.atBOL = true; } protected void checkAttrAllowed() { if (this.openTag != "<") { throw new IllegalArgumentException(); } } protected void openNest(String var1) { this.openTagNest.push(var1); ++this.indent; this.nestEmpty = true; } protected void closeNest() { this.closeNest(0); } protected void closeNest(int var1) { if (this.openTagNest.size() == var1) { this.closeTag(); } for(; this.openTagNest.size() > var1; this.closeTag()) { String var2 = (String)this.openTagNest.pop(); --this.indent; if (this.nestEmpty) { this.openTagIsEmpty = true; } else { this.openTag("</", var2); } } } protected void openTag(String var1, String var2) { this.openTag(var1, var2, false); } protected void openTag(String var1, String var2, boolean var3) { if (this.openTag != null) { this.closeTag(); } this.openTagIsEmpty = var3; this.openTag = var1; if (this.nextTagOnNewLine && !this.atBOL) { this.writeln(""); } this.write(String.valueOf(var1).concat(String.valueOf(var2))); } protected void closeTag() { if (this.openTag != null) { if (this.openTag == "<") { this.write(this.openTagIsEmpty ? "/>" : ">"); } else if (this.openTag == "</") { this.write(">"); this.nextTagOnNewLine = true; } else if (this.openTag == "<!--") { this.writeln("-->"); } else if (this.openTag == "<?") { this.writeln("?>"); } else if (this.openTag == "<![CDATA[") { this.write("]]>"); } else if (this.openTag == "&") { this.write(";"); } else if (this.openTag == "<?xml") { this.writeln("?>"); } else { if (this.openTag != "<!") { throw new IllegalArgumentException(); } this.writeln(">"); } } this.openTag = null; this.nestEmpty = false; } protected static String replace(String var0, String var1, String var2) { if (var0.indexOf(var1) < 0) { return var0; } else { int var3 = 0; StringBuffer var4 = new StringBuffer(); while(true) { int var5 = var0.indexOf(var1, var3); if (var5 == -1) { var4.append(var0.substring(var3)); return var4.toString(); } var4.append(String.valueOf(var0.substring(var3, var5)).concat(String.valueOf(var2))); var3 = var5 + var1.length(); } } } }